package pri.abner.practice.lambda;

import pri.abner.practice.lambda.api.MyRunnable;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @description lambda 表达式联系
 * @author  Abner Chow
 * @date Created in 2018/11/9 15:51
 * @version v1.0.0
 */
public class LambdaT {

    public static void main(String[] args) {

        //lambda自实现run方法
        MyRunnable hand = () -> {
            System.out.println("halo");
        };
        hand.run();

        List<Integer> list = new ArrayList();
        list.add(1);
        list.add(5);
        list.add(21);
        list.add(2);
        list.add(13);
        list.add(5);

        System.out.println("\n\nlambda 表达式 在集合的遍历用法\n");
        //利用lambda进行集合的块操作
        list.forEach(e -> {
            System.out.print(e + " ");
        });
        System.out.println("\n\n" + "利用jdk 8 新特性 stream （流）的相关方法进行数据的统计与过滤\n");

        //利用Collectors进行统计list中等于5的元素，并加入Map中

        // summingInt 中的 -> 标识每次重复的增数，设定1则表示每次重复自增1，从而起到统计重复数量的目的
        Map<Integer, Integer> statistics = list.stream().filter(e -> e == 5).collect(Collectors.groupingBy(f -> f, Collectors.summingInt(f -> 1)));

        System.out.println(" 元素5，个数的统计结果 " + statistics.toString());

        statistics = list.stream().filter(e -> e.equals(e)).collect(Collectors.groupingBy(f -> f, Collectors.summingInt(f -> 1)));

        System.out.println(" 统计结果 " + statistics.toString());

        System.out.println("\n\n数据过滤展示\n");

        //使用filter() 进行过滤
        //将list集合中等于1的元素过滤出来放入新集合中r
        List<Integer> r = list.stream().filter(e -> e == 5).collect(Collectors.toList());
        int i = 0;
        System.out.println(" 结果展示 ");
        r.forEach(e -> System.out.print(" " + e + " "));

        /**
         * 有时候一个流的数据源不一定是一个已存在的集合对象，也可能是个“生成器函数”。一个生成器函数会产生一系列元素，供给一个流。
         * Stream.generate(Supplier s)就是一个生成器函数。其中参数Supplier是一个函数接口，里面有唯一的抽象方法 get()。
         * */

        System.out.println("\n\n生成器函数（Generator function） 展示\n");

        Stream.generate(Math::random).limit(5).forEach(System.out::println);

    }
}
